// 实际场景：权限判断：掘金用户、掘金等级1级以上、前段开发、吃瓜群众 ······

// 不使用策略模式

function checkAuth(data) {
  if(data.role !== 'juejin') {
    console.log('不是掘金用户')
    return false
  }
  if (data.grade < 1) {
    console.log('等级小于1')
    return false
  }
  if (data.job !== 'FE') {
    console.log('不是前端开发')
    return false
  }
  if (data.type !== 'eat melons') {
    console.log('不是吃瓜群众')
    return false
  }
}

// 弊端：checkAuth 函数会爆炸 💥  策略项无法复用  违反开闭原则（不知道开放封闭原则的自行百度）

// 使用策略模式

const jobList = ['FE', 'BE']

var strategies = {
  // 检测是不是掘金用户
  checkRole: value => value === 'juejin',
  checkGrade: value => value >= 1,
  checkJob: value => jobList.indexOf(value) > 1,
  checkEatType: value => value === 'eat melons'
}

var Validator = function() {
  this.cache = []

  // 添加策略事件 value  method
  this.add = function(value, method) {
    this.cache.push(function() {
      return strategies[method](value)
    })
  }

  // 检测
  this.check = function() {
    for (let i = 0; i < this.cache.length; i++) {
      let valiFn = this.cache[i];
      var data = valiFn(); // 检查
      if (!data) {
        return false
      }
    }
    return true
  }
}

// 小彭使用策略模式进行操作
var compose1 = function() {
  var validator = new Validator();
  const data1 = {
    role: 'juejin',
    grade: 0
  };
  validator.add(data1.role, 'checkRole');
  validator.add(data1.grade, 'checkGrade');
  const result = validator.check();
  if (result) {
    console.log('检测通过')
  } else {
    console.log('检测未通过')
  }
  return result;
};

compose1()
